using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._IntelligenceTools._Analysis._BlindSpot
{
    /// <summary>
    /// <para>Generate Coverage Areas</para>
    /// <para>Creates a proximity buffer for input Intelligence, Surveillance, and Reconnaissance (ISR) or patrol assets for use in the Generate Blind Spot Areas tool.</para>
    /// <para>为输入情报、监视和侦察 （ISR） 或巡逻资产创建邻近缓冲区，以便在生成盲点区域工具中使用。</para>
    /// </summary>    
    [DisplayName("Generate Coverage Areas")]
    public class GenerateCoverageAreas : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public GenerateCoverageAreas()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_features">
        /// <para>Input Features</para>
        /// <para>The input asset features.</para>
        /// <para>输入资产功能。</para>
        /// </param>
        /// <param name="_out_feature_class">
        /// <para>Output Blind Spot Buffer</para>
        /// <para>The output blind spot buffer features.</para>
        /// <para>输出盲点缓冲器功能。</para>
        /// </param>
        /// <param name="_buffer_type">
        /// <para>Buffer Type</para>
        /// <para>The distance around the input features that will be buffered. Distances can be provided as either a value representing a linear distance or a field from the input features that defines the individual ranges and units to buffer each feature.</para>
        /// <para>将缓冲的输入要素周围的距离。距离可以作为表示线性距离的值提供，也可以作为与输入要素相距的字段提供，用于定义用于缓冲每个要素的各个范围和单位。</para>
        /// </param>
        public GenerateCoverageAreas(object _in_features, object _out_feature_class, object _buffer_type)
        {
            this._in_features = _in_features;
            this._out_feature_class = _out_feature_class;
            this._buffer_type = _buffer_type;
        }
        public override string ToolboxName => "Intelligence Tools";

        public override string ToolName => "Generate Coverage Areas";

        public override string CallName => "intelligence.GenerateCoverageAreas";

        public override List<string> AcceptEnvironments => [];

        public override object[] ParameterInfo => [_in_features, _out_feature_class, _buffer_type, _range_unit.GetGPValue(), _start_time_field, _end_time_field];

        /// <summary>
        /// <para>Input Features</para>
        /// <para>The input asset features.</para>
        /// <para>输入资产功能。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_features { get; set; }


        /// <summary>
        /// <para>Output Blind Spot Buffer</para>
        /// <para>The output blind spot buffer features.</para>
        /// <para>输出盲点缓冲器功能。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Blind Spot Buffer")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_feature_class { get; set; }


        /// <summary>
        /// <para>Buffer Type</para>
        /// <para>The distance around the input features that will be buffered. Distances can be provided as either a value representing a linear distance or a field from the input features that defines the individual ranges and units to buffer each feature.</para>
        /// <para>将缓冲的输入要素周围的距离。距离可以作为表示线性距离的值提供，也可以作为与输入要素相距的字段提供，用于定义用于缓冲每个要素的各个范围和单位。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Buffer Type")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _buffer_type { get; set; }


        /// <summary>
        /// <para>Range Unit</para>
        /// <para><xdoc>
        ///   <para>Specifies a linear unit when the chosen Buffer Type parameter value does not contain the unit of distance.</para>
        ///   <bulletList>
        ///     <bullet_item>Meters—The distance unit will be meters.</bullet_item><para/>
        ///     <bullet_item>Kilometers—The distance unit will be kilometers.</bullet_item><para/>
        ///     <bullet_item>Feet—The distance unit will be feet.</bullet_item><para/>
        ///     <bullet_item>Miles—The distance unit will be miles.</bullet_item><para/>
        ///     <bullet_item>Nautical Miles—The distance unit will be nautical miles.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>当所选的“缓冲区类型”参数值不包含距离单位时，指定线性单位。</para>
        ///   <bulletList>
        ///     <bullet_item>米—距离单位将为米。</bullet_item><para/>
        ///     <bullet_item>千米—距离单位将为千米。</bullet_item><para/>
        ///     <bullet_item>英尺—距离单位将为英尺。</bullet_item><para/>
        ///     <bullet_item>英里—距离单位将为英里。</bullet_item><para/>
        ///     <bullet_item>海里—距离单位为海里。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Range Unit")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _range_unit_value? _range_unit { get; set; } = null;

        public enum _range_unit_value
        {
            /// <summary>
            /// <para>Meters</para>
            /// <para>Meters—The distance unit will be meters.</para>
            /// <para>米—距离单位将为米。</para>
            /// </summary>
            [Description("Meters")]
            [GPEnumValue("Meters")]
            _Meters,

            /// <summary>
            /// <para>Kilometers</para>
            /// <para>Kilometers—The distance unit will be kilometers.</para>
            /// <para>千米—距离单位将为千米。</para>
            /// </summary>
            [Description("Kilometers")]
            [GPEnumValue("Kilometers")]
            _Kilometers,

            /// <summary>
            /// <para>Feet</para>
            /// <para>Feet—The distance unit will be feet.</para>
            /// <para>英尺—距离单位将为英尺。</para>
            /// </summary>
            [Description("Feet")]
            [GPEnumValue("Feet")]
            _Feet,

            /// <summary>
            /// <para>Miles</para>
            /// <para>Miles—The distance unit will be miles.</para>
            /// <para>英里—距离单位将为英里。</para>
            /// </summary>
            [Description("Miles")]
            [GPEnumValue("Miles")]
            _Miles,

            /// <summary>
            /// <para>Nautical Miles</para>
            /// <para>Nautical Miles—The distance unit will be nautical miles.</para>
            /// <para>海里—距离单位为海里。</para>
            /// </summary>
            [Description("Nautical Miles")]
            [GPEnumValue("NauticalMiles")]
            _NauticalMiles,

        }

        /// <summary>
        /// <para>Start Time Field</para>
        /// <para>The field containing the start date and time the asset is available.</para>
        /// <para>包含资产可用的开始日期和时间的字段。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Start Time Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _start_time_field { get; set; } = null;


        /// <summary>
        /// <para>End Time Field</para>
        /// <para>The field containing the end date and time the asset is no longer available.</para>
        /// <para>包含资产不再可用的结束日期和时间的字段。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("End Time Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _end_time_field { get; set; } = null;


        public GenerateCoverageAreas SetEnv()
        {
            base.SetEnv();
            return this;
        }

    }

}